package com.coder.rental.utils;

import com.coder.rental.entity.Permission;
import com.coder.rental.vo.RouteVO;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class RouteTreeUtils {
    /**
     * 构建路由树
     *
     * 根据权限列表和父ID构建路由树结构主要用于前端路由配置
     *
     * @param permissionList 权限列表，包含所有权限节点信息
     * @param pid 父节点ID，用于筛选根节点或子节点
     * @return 返回构建好的路由树列表
     */
    public static List<RouteVO> buildRouteTree(List<Permission> permissionList, int pid) {
        // 初始化路由VO列表
        List<RouteVO> routeVoList = new ArrayList<>();
        // 使用Optional处理可能为空的权限列表，并转换为Stream进行处理
        Optional.ofNullable(permissionList).orElse(new ArrayList<>())
                    .stream()
                    // 过滤出符合当前父ID的权限对象
                    .filter(permission -> permission != null && permission.getPid() == pid)
                    // 对每个权限对象进行处理，构建RouteVO对象
                    .forEach(permission -> {
                        RouteVO routeVO = new RouteVO();
                        // 设置路由路径和名称
                        routeVO.setPath(permission.getRoutePath());//获取路由路径
                        routeVO.setName(permission.getRouteName());//获取路由名称
                        // 判断是否为根路径菜单并设置组件和显示属性
                        if (permission.getPid() == 0){
                            routeVO.setComponent("Layout");
                            routeVO.setAlwaysShow(true);
                        }else {
                            routeVO.setComponent(permission.getRouteUrl());
                            routeVO.setAlwaysShow(false);
                        }
                        // 设置路由的元数据，包括标签、图标和权限代码
                        routeVO.setMeta(routeVO.new Meta(permission.getPermissionLabel(),
                                permission.getIcon(),
                                permission.getPermissionCode().split(",")));
                        // 递归构建子路由树
                        List<RouteVO> children = buildRouteTree(permissionList, permission.getId());
                        routeVO.setChildren(children);
                        // 将构建好的RouteVO添加到列表中
                        routeVoList.add(routeVO);
                    });
        // 返回构建好的路由树列表
        return routeVoList;
    }
}
